package com.divemotor.ventarepuestosinternet.model;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;


@Entity
@Table(name = "REP_MAE_USUARIO_CLIENTE")
@NamedQueries({
	@NamedQuery(name="UsuarioCliente.codigoCliente", 
				query="SELECT c.idCliente FROM UsuarioCliente uc JOIN uc.cliente c WHERE uc.idUsuarioCliente =:usuarioCliente"),
	@NamedQuery(name="UsuarioCliente.getUsuarios", 
				query="SELECT new com.divemotor.ventarepuestosinternet.beans.adapter.UsuarioClienteAdapter(uc.idUsuarioCliente, " +
					  "u.nombres, u.apellidos, td.nombre, uc.numeroDocumento) " +
					  "FROM UsuarioCliente uc JOIN uc.cliente c JOIN uc.usuario u " +
					  "JOIN uc.tipoDocumento td WHERE c.idCliente =:idCliente AND uc.estado <> :estado")
})
public class UsuarioCliente  implements Serializable  {

	private static final long serialVersionUID = 1L;
	
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_REP_MOV_USUARIO_CLIENTE")
	@SequenceGenerator(name = "SEQ_REP_MOV_USUARIO_CLIENTE", sequenceName = "REPUESTOS.SEQ_REP_MOV_USUARIO_CLIENTE", allocationSize = 0)
	@Column(name = "cod_id_usuario_cliente")
	private Integer idUsuarioCliente;
	@Column(name = "ind_estado", length=1)
	private String estado;	
	@Column(name = "numero_documento", length = 15)
	private String numeroDocumento;
	@Column(name = "txt_cargo", length = 50)
	private String cargo;
	@Column(name = "txt_telfono_fijo", length = 15)
	private String telefonoFijo;
	@Column(name = "txt_telfono_rpc", length = 15)
	private String telefonoRpc;
	@Column(name = "txt_telfono_rpm", length = 15)
	private String telefonoRpm;
	@Column(name = "txt_telfono_nextel", length = 15)
	private String telefonoNextel;
	@Temporal(TemporalType.DATE)
	@Column(name = "fec_creacion")
	private Date fechaCreacion;
	@Temporal(TemporalType.DATE)
	@Column(name = "fec_modificacion")
	private Date fechaModificacion;
	@Temporal(TemporalType.DATE)
	@Column(name = "fec_eliminacion")
	private Date fechaEliminacion;
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name = "cod_id_usuario" , referencedColumnName = "cod_id_usuario")
	private Usuario usuario;
	@ManyToOne(fetch=FetchType.EAGER)
	@JoinColumn(name = "cod_cliente" ,referencedColumnName = "cod_cliente" )
	private Cliente cliente;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "cod_id_tipo_documento" ,referencedColumnName = "cod_id_tipo_documento")
	private TipoDocumento tipoDocumento;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="COD_ID_USUARIO_CREACION",referencedColumnName="COD_ID_USUARIO" )
	private Usuario usuarioCreacion;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="COD_ID_USUARIO_MODIFICACION",referencedColumnName="COD_ID_USUARIO")
	private Usuario usuarioModificacion;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="COD_ID_USUARIO_ELIMINACION",referencedColumnName="COD_ID_USUARIO")
	private Usuario usuarioEliminacion;
	
	@Transient
	private String idCliente;
	
	public UsuarioCliente(){
		usuario = new Usuario();
	}
	
	public Usuario getUsuarioCreacion() {
		return usuarioCreacion;
	}
	
	public void setUsuarioCreacion(Usuario usuarioCreacion) {
		this.usuarioCreacion = usuarioCreacion;
	}
	
	public Usuario getUsuarioModificacion() {
		return usuarioModificacion;
	}
	
	public void setUsuarioModificacion(Usuario usuarioModificacion) {
		this.usuarioModificacion = usuarioModificacion;
	}
	
	public Usuario getUsuarioEliminacion() {
		return usuarioEliminacion;
	}
	
	public void setUsuarioEliminacion(Usuario usuarioEliminacion) {
		this.usuarioEliminacion = usuarioEliminacion;
	}

	public Date getFechaCreacion() {
		return fechaCreacion;
	}
	
	public void setFechaCreacion(Date fechaCreacion) {
		this.fechaCreacion = fechaCreacion;
	}
	
	public Date getFechaModificacion() {
		return fechaModificacion;
	}
	
	public void setFechaModificacion(Date fechaModificacion) {
		this.fechaModificacion = fechaModificacion;
	}
	
	public Date getFechaEliminacion() {
		return fechaEliminacion;
	}
	
	public void setFechaEliminacion(Date fechaEliminacion) {
		this.fechaEliminacion = fechaEliminacion;
	}

	public Integer getIdUsuarioCliente() {
		return idUsuarioCliente;
	}

	public void setIdUsuarioCliente(Integer idUsuarioCliente) {
		this.idUsuarioCliente = idUsuarioCliente;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public String getCargo() {
		return cargo;
	}

	public void setCargo(String cargo) {
		this.cargo = cargo;
	}

	public String getTelefonoFijo() {
		return telefonoFijo;
	}

	public void setTelefonoFijo(String telefonoFijo) {
		this.telefonoFijo = telefonoFijo;
	}

	public String getTelefonoRpc() {
		return telefonoRpc;
	}

	public void setTelefonoRpc(String telefonoRpc) {
		this.telefonoRpc = telefonoRpc;
	}

	public String getTelefonoRpm() {
		return telefonoRpm;
	}

	public void setTelefonoRpm(String telefonoRpm) {
		this.telefonoRpm = telefonoRpm;
	}

	public String getTelefonoNextel() {
		return telefonoNextel;
	}

	public void setTelefonoNextel(String telefonoNextel) {
		this.telefonoNextel = telefonoNextel;
	}

	public TipoDocumento getTipoDocumento() {
		return tipoDocumento;
	}

	public void setTipoDocumento(TipoDocumento tipoDocumento) {
		this.tipoDocumento = tipoDocumento;
	}

	public String getNumeroDocumento() {
		return numeroDocumento;
	}

	public void setNumeroDocumento(String numeroDocumento) {
		this.numeroDocumento = numeroDocumento;
	}

	public String getIdCliente() {
		return idCliente;
	}

	public void setIdCliente(String idCliente) {
		this.idCliente = idCliente;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((idUsuarioCliente == null) ? 0 : idUsuarioCliente.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj){
			return true;
		}
		if (obj == null){
			return false;
		}
		if (getClass() != obj.getClass()){
			return false;
		}
		UsuarioCliente other = (UsuarioCliente) obj;
		if (idUsuarioCliente == null) {
			if (other.idUsuarioCliente != null){
				return false;
			}
		} else if (!idUsuarioCliente.equals(other.idUsuarioCliente)){
			return false;
		}
		return true;
	}	
	
}
